#pragma once
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "InetAddr.hpp"

class UDPClient
{
public:
    UDPClient(uint16_t port, std::string ip) : dst_addr({ip, port})
    {
        // 1.创建套接字
        _sockfd = ::socket(AF_INET, SOCK_DGRAM, 0);
        if (_sockfd < 0)
        {
            std::cerr << "socket error" << std::endl;
            exit(1);
        }
        // 2.绑定？
        // 不需要
    }
    void Run()
    {
        std::string message;
        while (true)
        {
            std::cout << "Please Enter # ";
            std::getline(std::cin, message);
            // 向目标主机发送message
            ::sendto(_sockfd, message.c_str(), message.size(), 0, dst_addr.NetAddr(), dst_addr.Len());
            // 用以接收由Sever发送回来的数据
            char buff[1024];
            sockaddr_in src_addr;
            socklen_t len;
            int n = ::recvfrom(_sockfd, buff, sizeof(buff) - 1, 0, (struct sockaddr *)&src_addr, &len);
            if (n > 0)
            {
                buff[n] = '\0';
                std::cout << buff << std::endl;
            }
        }
    }

    ~UDPClient()
    {
        close(_sockfd);
    }

private:
    int _sockfd;
    InetAddr dst_addr; // 目标主机结构
};